package com.h.principle;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 模拟实验 Bean的生命周期
 */
@Component
public class BeanLifeComponent implements BeanNameAware {
    private DogComponent dogComponent;

    // 实例化，也就是构造方法
    public BeanLifeComponent(DogComponent dogComponent) {
        this.dogComponent = dogComponent;
        System.out.println("构造方法(实例化)的执行");
    }

    // 属性赋值，也就是属性的注入，这里使用 set方法进行注入
    @Autowired
    public void setDogComponent(DogComponent dogComponent) {
        this.dogComponent = dogComponent;
        System.out.println("属性赋值的执行");
    }

    // 初始化
    // a.各种通知
    @Override
    public void setBeanName(String name) {
        // 获得Bean的名称
        System.out.println("执行BeanNameAware，beanName: " + name);
    }

    // b.执行初始化方法
    @PostConstruct
    public void init() {
        System.out.println("执行初始化方法");
    }

    // 使用Bean
    public void use() {
        System.out.println("使用Bean，执行use方法");
    }

    // 销毁Bean
    @PreDestroy
    public void destroy() {
        System.out.println("销毁Bean");
    }
}
